package com.loy;
import com.aspose.words.*;

import java.util.ArrayList;
import java.util.List;

public class Test {
    private static String path="D:\\java\\数据文件.docx";

    public static void main(String[] args) throws Exception {
        // 加载Word文档
        Document doc = new Document(path);

        // 存储结果
        List<String> contentLines = new ArrayList<>();

        // 获取文档中所有节点
        NodeCollection<Node> nodes = doc.getChildNodes(NodeType.ANY, true);

        // 遍历所有节点
        for (Node node : nodes) {
            switch (node.getNodeType()) {
                case NodeType.PARAGRAPH:
                    processParagraph((Paragraph) node, contentLines);
                    break;
                case NodeType.TABLE:
                    processTable((Table) node, contentLines);
                    break;
                // 可以添加其他节点类型的处理
            }
        }

        // 输出结果
        contentLines.forEach(System.out::println);
    }

    // 处理段落（包括标题）
    private static void processParagraph(Paragraph para, List<String> contentLines) {
        // 跳过空段落
        if (para.getText().trim().isEmpty()) {
            return;
        }

        // 获取段落文本
        String paraText = para.getText().trim();

        // 检查是否是标题
        if (isHeading(para)) {
            // 获取标题级别
            int headingLevel = getHeadingLevel(para);

            // 获取标题前的编号（如果有）
            String numberingText = getNumberingText(para);

            // 组合标题文本
            String headingText = String.format("[标题%d %s] %s",
                    headingLevel, numberingText, paraText);

            contentLines.add(headingText);
        } else {
            // 普通段落
            contentLines.add("[段落] " + paraText);
        }
    }

    // 处理表格
    private static void processTable(Table table, List<String> contentLines) {
        contentLines.add("\n[这是一个表格]");

//        for (Row row : table.getRows()) {
//            for (Cell cell : row.getCells()) {
//                // 获取单元格文本（包括内部段落）
//                String cellText = cell.getText().trim();
//                contentLines.add("单元格: " + cellText);
//            }
//        }

//        contentLines.add("[表格结束]\n");
    }

    // 判断是否是标题段落
    private static boolean isHeading(Paragraph para) {
        String styleName = para.getParagraphFormat().getStyle().getName();
        return styleName != null && styleName.startsWith("Heading");
    }

    // 获取标题级别
    private static int getHeadingLevel(Paragraph para) {
        String styleName = para.getParagraphFormat().getStyle().getName();
        return Integer.parseInt(styleName.replace("Heading ", ""));
    }

    // 获取段落前的编号文本
    private static String getNumberingText(Paragraph para) {
        try {
            if (para.isListItem()) {
                // 获取当前级别的编号
                String currentNumber = String.valueOf(
                        para.getListFormat().getListLevel());

                // 如果是多级列表，需要获取完整编号链
                if (para.getListFormat().getListLevelNumber() > 0) {
                    StringBuilder fullNumber = new StringBuilder();
                    Paragraph currentPara = para;

                    // 向上追溯多级编号
                    while (currentPara != null && currentPara.isListItem()) {
                        String levelNumber = String.valueOf(
                                currentPara.getListFormat().getListLevel());

                        if (fullNumber.length() > 0) {
                            fullNumber.insert(0, ".");
                        }
                        fullNumber.insert(0, levelNumber);

                        // 移动到上一段落
                        Node previousNode = currentPara.getPreviousSibling();
                        currentPara = (previousNode != null &&
                                previousNode.getNodeType() == NodeType.PARAGRAPH)
                                ? (Paragraph) previousNode : null;
                    }

                    return fullNumber.toString();
                }

                return currentNumber;
            }
        } catch (Exception e) {
            e.printStackTrace();
        }
        return "";
    }
}
